﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DTO_MechSys;
using BLL_MechSys;

namespace FORMS_MechSys
{
    public partial class frmAgendamentoCadastro : Form
    {
        DTOAgendamento dtoAgendamento = new DTOAgendamento();
        BLLAgendamento bllAgendamento = new BLLAgendamento();
        DateTime dataAtual;
        DataTable dataTableAgendamentos;

        
        

        DTOCor dtoCorPrincipal = new DTOCor();
        DTOCor dtoCorFundo = new DTOCor();
        DTOCor dtoCorLetra = new DTOCor();
        DTOCor dtoCorDataGrid = new DTOCor();
        int agendamentoID, clienteID, veiculoID;
        BLLCor bllCor = new BLLCor();
                
        
        public frmAgendamentoCadastro()
        {
            InitializeComponent();
            rdbtnManha.Checked = true;
            SetColors();
        }

        private void SetColors()
        {
            dtoCorPrincipal = bllCor.Buscar("Principal");

            btnCancelar.BackColor = label4.BackColor = tableLayoutPanel2.BackColor = tableLayoutPanel4.BackColor = 
              btnEditar.BackColor = tlpMenuStripLeft.BackColor = tlpMenuStripCenter.BackColor = groupBox4.BackColor =
              btnCancelar.BackColor = btnNovo.BackColor = tlpMenuStripRigth.BackColor = btnSair.BackColor =
              tableLayoutPanel6.BackColor = btnBuscarCliente.BackColor = btnBuscarVeiculo.BackColor = btnSair.BackColor =
              btnEditar.BackColor = btnSalvar.BackColor = btnExcluir.BackColor = dtoCorPrincipal.Cor;

            dtoCorFundo = bllCor.Buscar("Fundo");
            tlpMenuStrip.BackColor =
            tableLayoutPanel1.BackColor = dtoCorFundo.Cor;

            dtoCorDataGrid = bllCor.Buscar("DataGrid");
            dtGridAgendaDia.BackgroundColor = dtoCorDataGrid.Cor;

            dtoCorLetra = bllCor.Buscar("Letra");
            label2.ForeColor = label3.ForeColor = label1.ForeColor = rdbtnManha.ForeColor = rdbtnTarde.ForeColor =
                label4.ForeColor = label5.ForeColor = label6.ForeColor = btnNovo.ForeColor =
                btnEditar.ForeColor = btnExcluir.ForeColor = btnCancelar.ForeColor = btnSalvar.ForeColor =
                dtoCorLetra.Cor;


        }

        private void frmAgendamentoCadastro_Load(object sender, EventArgs e)
        {
            Habilitar(false);
            dtGridAgendaDia.DataSource = PopulaGrid(CalendarioAgend.SelectionStart.Date, 0);
        }

        public DataTable PopulaGrid(DateTime data, byte turno)
        {
            DateTime dataRegistro;
            DataTable dataTableGridView = new DataTable();
            DataRow dataRow;

            dataTableAgendamentos = bllAgendamento.BuscarAgendamentoPorData(data, turno);
            try
            {
                if (dataTableAgendamentos.Rows.Count > 0)
                {
                    dataTableGridView.Columns.Add("Nome", typeof(string));                
                    dataTableGridView.Columns.Add("Veiculo", typeof(string));                   
                    dataTableGridView.Columns.Add("Placa", typeof(string));
                    dataTableGridView.Columns.Add("StatusAtual", typeof(string));
                    dataTableGridView.Columns.Add("HoraRegistro", typeof(string));

                    for (int i = 0; i < dataTableAgendamentos.Rows.Count; i++)
                    {
                        dataRow = dataTableGridView.NewRow();

                        dataRow["Nome"] = string.Format("{0} {1}", dataTableAgendamentos.Rows[i]["Nome"], dataTableAgendamentos.Rows[i]["Sobrenome"]);
                        dataRow["Veiculo"] = string.Format("{0} {1}", dataTableAgendamentos.Rows[i]["Marca"], dataTableAgendamentos.Rows[i]["Modelo"]);
                        dataRow["Placa"] = dataTableAgendamentos.Rows[i]["Placa"];
                        dataRow["StatusAtual"] = VerificaStatus((BLLEnumStatus)(int)dataTableAgendamentos.Rows[i]["StatusAtual"]);
                        dataRegistro = Convert.ToDateTime(dataTableAgendamentos.Rows[i]["DataRegistro"]);
                        dataRow["HoraRegistro"] = string.Format("{0:00}:{1:00}:{2:00}", dataRegistro.Hour, dataRegistro.Minute, dataRegistro.Second);

                        // Adiciona linha ao DataTable.
                        dataTableGridView.Rows.Add(dataRow);

                    }
                }
                               
            }
            catch(Exception)
            {
                new frmMessageBox().Show("Não foi possível carregar os dados para o grid!", "Carregamento", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error);               
            }

            btnExcluir.Enabled = false;
            return dataTableGridView;
        }
      
        public string VerificaStatus(BLLEnumStatus enume)
        {
            //Status 0-Agendado 1-Atrasado 2-Concluído 3-Cancelado 4-Não compareceu           
            string stringStatus = "Agendado";

            switch (enume)
            {               
                case BLLEnumStatus.Concluído:
                    stringStatus = "Concluído";
                    break;
                case BLLEnumStatus.Cancelado:
                    stringStatus = "Cancelado";
                    break;
                case BLLEnumStatus.NãoCompareceu:
                    stringStatus = "Não Compareceu";
                    break;
                default:
                    break;
            }

            return stringStatus;
        }

        public void Habilitar(bool status)
        {
            txtResumo.Enabled = status;
            txtDescricao.Enabled = status;
            btnBuscarCliente.Enabled = status;
            btnBuscarVeiculo.Enabled = status;
            btnNovo.Enabled = !status;
            btnEditar.Enabled = false;
            btnCancelar.Enabled = status;
            btnSalvar.Enabled = status;
        }

        public void Limpar()
        {
            txtCliente.Clear();
            txtVeiculo.Clear();
            txtResumo.Clear();
            txtDescricao.Clear();            
            BLLUtilitarios.clienteNome = null;
            BLLUtilitarios.veiculoNome = null;

        }

        private void Atualizar()
        {
            try
            {
                dtoAgendamento.AgendamentoID = agendamentoID;
                dtoAgendamento.ClienteID = clienteID;
                dtoAgendamento.VeiculoID = veiculoID;
                dtoAgendamento.DataAgendada = CalendarioAgend.SelectionStart.Date;
                dtoAgendamento.Resumo = txtResumo.Text;
                dtoAgendamento.Descricao = txtDescricao.Text;
                if (rdbtnManha.Checked)
                {
                    dtoAgendamento.Turno = 0; //Manhã
                }
                if (rdbtnTarde.Checked)
                {
                    dtoAgendamento.Turno = 1; //Tarde
                }

                dataAtual = DateTime.Now;

                if (!string.IsNullOrEmpty(clienteID.ToString()) && !string.IsNullOrEmpty(veiculoID.ToString()) && !string.IsNullOrEmpty(txtResumo.Text) && !string.IsNullOrEmpty(txtDescricao.Text))
                {
                    TimeSpan timeSpanAgendamento = new TimeSpan();
                    dataAtual = DateTime.Now.Date;                   
                    timeSpanAgendamento = CalendarioAgend.SelectionStart.Date.Subtract(dataAtual);

                    if (timeSpanAgendamento.TotalSeconds > 0)
                    {
                        bllAgendamento.Atualizar(dtoAgendamento);
                        new frmMessageBox().Show("Agendamento atualizado com sucesso!", "Atualização", MessageBoxButtons.OK, MessageBoxIcon.Information);

                        Limpar();
                        Habilitar(false);

                        dtGridAgendaDia.DataSource = PopulaGrid(dtoAgendamento.DataAgendada, dtoAgendamento.Turno);
                    }
                    else
                    {
                        new frmMessageBox().Show("Não é possível atualizar um agendamento com a data vencida!", "Data Inválida", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
                else
                {
                    new frmMessageBox().Show("Dados insuficientes, preencha o formulário corretamente!", "Atualização", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            }
            catch (Exception)
            {
                new frmMessageBox().Show("Não foi possível atualizar o agendamento!", "Atualização", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }     

        private void tableLayoutPanel1_Paint(object sender, PaintEventArgs e)
        {

        }

        private void btnNovo_Click(object sender, EventArgs e)
        {
            Habilitar(true);
            Limpar();
            btnBuscarCliente.Focus();
            toolTip1 = new ToolTip();
            toolTip1.Show("Selecione um Cliente:", btnBuscarCliente);
            timerDoToolTip.Enabled = true;
            inicioToolTip = DateTime.Now.AddSeconds(3);
        }

        private void btnEditar_Click(object sender, EventArgs e)
        {
            Habilitar(true);
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            Limpar();
            Habilitar(false);
        }

        private void btnExcluir_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(agendamentoID.ToString()))
            {
                try
                {
                    if (new frmMessageBox().Show("Tem certeza que deseja excluir este agendamento?", "Exclusão", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.OK)
                    {
                        bllAgendamento.Excluir(agendamentoID);
                        new frmMessageBox().Show("Agendamento excluído com sucesso!", "Exclusão", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        Limpar();

                        dtGridAgendaDia.DataSource = PopulaGrid(CalendarioAgend.SelectionStart.Date, 0);
                    }
                }
                catch
                {
                    new frmMessageBox().Show("Não foi possível excluir o agendamento!", "Exclusão", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            else
            {
                new frmMessageBox().Show("Selecione um agendamento para excluir!", "Exclusão", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        private void btnSalvar_Click(object sender, EventArgs e)
        {
            if (bllAgendamento.VerificaSeAgendamentoIDExiste(agendamentoID) == false)
            {               

                clienteID = BLLUtilitarios.clienteID;
                veiculoID = BLLUtilitarios.veiculoID;

                try
                {
                    dtoAgendamento.ClienteID = clienteID;
                    dtoAgendamento.VeiculoID = veiculoID;
                    dtoAgendamento.DataAgendada = CalendarioAgend.SelectionStart.Date;
                    dtoAgendamento.Resumo = txtResumo.Text;
                    dtoAgendamento.Descricao = txtDescricao.Text;
                    if (rdbtnManha.Checked)
                    {
                        dtoAgendamento.Turno = 0; //Manhã
                    }
                    if (rdbtnTarde.Checked)
                    {
                        dtoAgendamento.Turno = 1; //Tarde
                    }

                    dataAtual = DateTime.Now.Date;
                    if (bllAgendamento.VerificaAgendamentoRealizado(dataAtual, dtoAgendamento.Turno, clienteID) == false)
                    {
                        if (!string.IsNullOrEmpty(clienteID.ToString()) && !string.IsNullOrEmpty(veiculoID.ToString()) && !string.IsNullOrEmpty(txtResumo.Text) && !string.IsNullOrEmpty(txtDescricao.Text))
                        {
                            TimeSpan timeSpanAgendamento = new TimeSpan();
                           
                            timeSpanAgendamento = CalendarioAgend.SelectionStart.Date.Subtract(dataAtual);

                            if (timeSpanAgendamento.TotalSeconds >= 0)
                            {
                                bllAgendamento.Inserir(dtoAgendamento);
                                new frmMessageBox().Show("Horário agendado com sucesso!", "Agendamento", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                Limpar();
                                Habilitar(false);

                                dtGridAgendaDia.DataSource = PopulaGrid(dtoAgendamento.DataAgendada, dtoAgendamento.Turno);
                            }
                            else
                            {
                                new frmMessageBox().Show("Não é possível efetuar o agendamento com uma data vencida!\nInforme uma data correta!", "Data Inválida", MessageBoxButtons.OK, MessageBoxIcon.Error); 
                            }
                        }
                        else
                        {
                            new frmMessageBox().Show("Dados insuficientes, preencha o formulário corretamente!", "Agendamento", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        }
                    }
                    else
                    {
                        new frmMessageBox().Show("Este cliente já possui um horário agendado neste turno!", "Agendamento", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    }

                }
                catch (Exception)
                {
                    new frmMessageBox().Show("Não foi possível agendar horário!", "Agendamento", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            else
            {
                Atualizar();
            }
        }

        private void btnBuscarCliente_Click(object sender, EventArgs e)
        {
            timer.Enabled = true;
            frmClienteSelecionar frmSelecionaCliente = new frmClienteSelecionar();
            frmSelecionaCliente.ShowDialog();
        }

        private void btnBuscarVeiculo_Click(object sender, EventArgs e)
        {
            timer.Enabled = true;
            frmVeiculoSelecionar frmSelecionaVeiculo = new frmVeiculoSelecionar();
            frmSelecionaVeiculo.ShowDialog();
        }

        private void rdbtnManha_CheckedChanged(object sender, EventArgs e)
        {
            dtGridAgendaDia.DataSource = PopulaGrid(CalendarioAgend.SelectionStart.Date, 0);
        }

        private void rdbtnTarde_CheckedChanged(object sender, EventArgs e)
        {
            dtGridAgendaDia.DataSource = PopulaGrid(CalendarioAgend.SelectionStart.Date, 1);
        }

        private void CalendarioAgend_DateChanged(object sender, DateRangeEventArgs e)
        {
            //Obter Agendamentos por Data e Turno.

            if (rdbtnManha.Checked)
            {
                dtGridAgendaDia.DataSource = PopulaGrid(e.Start.Date, 0);
            }
            if (rdbtnTarde.Checked)
            {
                dtGridAgendaDia.DataSource = PopulaGrid(e.Start.Date, 1);
            }
        }

        private void dtGridAgendaDia_CellClick(object sender, DataGridViewCellEventArgs e)
        {
             if (e.RowIndex != -1)
             {
                 btnExcluir.Enabled = true;

                 if(!string.IsNullOrEmpty(dataTableAgendamentos.Rows[e.RowIndex]["AgendamentoID"].ToString()))
                 agendamentoID = (int)dataTableAgendamentos.Rows[e.RowIndex]["AgendamentoID"];
                 if (!string.IsNullOrEmpty(dataTableAgendamentos.Rows[e.RowIndex]["ClienteID"].ToString()))
                 clienteID = (int)dataTableAgendamentos.Rows[e.RowIndex]["ClienteID"];
                 if (!string.IsNullOrEmpty(dataTableAgendamentos.Rows[e.RowIndex]["VeiculoID"].ToString()))
                 veiculoID = (int)dataTableAgendamentos.Rows[e.RowIndex]["VeiculoID"];
                 if(!string.IsNullOrEmpty(dtGridAgendaDia.Rows[e.RowIndex].Cells["Nome"].Value.ToString()))
                 txtCliente.Text = (string)dtGridAgendaDia.Rows[e.RowIndex].Cells["Nome"].Value;
                 if (!string.IsNullOrEmpty(dtGridAgendaDia.Rows[e.RowIndex].Cells["Veiculo"].Value.ToString()))
                 txtVeiculo.Text = (string)dtGridAgendaDia.Rows[e.RowIndex].Cells["Veiculo"].Value;
                 if (!string.IsNullOrEmpty(dataTableAgendamentos.Rows[e.RowIndex]["Resumo"].ToString()))
                 txtResumo.Text = (string)dataTableAgendamentos.Rows[e.RowIndex]["Resumo"];
                 if (!string.IsNullOrEmpty(dataTableAgendamentos.Rows[e.RowIndex]["Descricao"].ToString()))
                 txtDescricao.Text = (string)dataTableAgendamentos.Rows[e.RowIndex]["Descricao"];

                 Habilitar(false);
                 btnEditar.Enabled = true;
             }
        }

        private void timer_Tick(object sender, EventArgs e)
        {
            string clienteNome = BLLUtilitarios.clienteNome;
            string veiculoNome = BLLUtilitarios.veiculoNome;

            if (!string.IsNullOrEmpty(clienteNome) || !string.IsNullOrEmpty(veiculoNome))
            {
                txtCliente.Text = clienteNome;
                txtVeiculo.Text = veiculoNome;
            }
            if (!string.IsNullOrEmpty(clienteNome) && !string.IsNullOrEmpty(veiculoNome))
            {
                timer.Enabled = false;
            }           
        }

        private void toolStripButtonSair_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnNovo_EnabledChanged(object sender, EventArgs e)
        {
            if (btnNovo.Enabled)
                btnNovo.BackColor = dtoCorPrincipal.Cor;
            else
                btnNovo.BackColor = dtoCorFundo.Cor;

        }

        private void btnEditar_EnabledChanged(object sender, EventArgs e)
        {
            if (btnEditar.Enabled)
                btnEditar.BackColor = dtoCorPrincipal.Cor;
            else
                btnEditar.BackColor = dtoCorFundo.Cor;


        }

        private void btnCancelar_EnabledChanged(object sender, EventArgs e)
        {
            if (btnCancelar.Enabled)
                btnCancelar.BackColor = dtoCorPrincipal.Cor;
            else
                btnCancelar.BackColor = dtoCorFundo.Cor;


        }

        private void btnExcluir_EnabledChanged(object sender, EventArgs e)
        {
            if (btnExcluir.Enabled)
                btnExcluir.BackColor = dtoCorPrincipal.Cor;
            else
                btnExcluir.BackColor = dtoCorFundo.Cor;
        }

        private void btnSalvar_EnabledChanged(object sender, EventArgs e)
        {
            if (btnSalvar.Enabled)
                btnSalvar.BackColor = dtoCorPrincipal.Cor;
            else
                btnSalvar.BackColor = dtoCorFundo.Cor;
        

        }

        DateTime inicioToolTip;
        private void timerDoToolTip_Tick(object sender, EventArgs e)
        {
            if (DateTime.Now > inicioToolTip) 
            {
                toolTip1.Dispose();
                timerDoToolTip.Enabled = false;
            }
        }
    }
}
